/*
 * Copyright (C) 1999-2011, Broadcom Corporation
 * 
 *         Unless you and Broadcom execute a separate written software license
 * agreement governing use of this software, this software is licensed to you
 * under the terms of the GNU General Public License version 2 (the "GPL"),
 * available at http://www.broadcom.com/licenses/GPLv2.php, with the
 * following added to such license:
 * 
 *      As a special exception, the copyright holders of this software give you
 * permission to link this software with independent modules, and to copy and
 * distribute the resulting executable under terms of your choice, provided that
 * you also meet, for each linked independent module, the terms and conditions of
 * the license of that module.  An independent module is a module which is not
 * derived from this software.  The special exception does not apply to any
 * modifications of the software.
 * 
 *      Notwithstanding the above, under no circumstances may you combine this
 * software in any way with any other Broadcom software provided under a license
 * other than the GPL, without Broadcom's express prior written consent.
 *
 * Fundamental types and constants relating to WFA P2P (aka WiFi Direct)
 *
 * $Id: p2p.h 277737 2011-08-16 17:54:59Z $
 */

#ifndef _P2P_H_
#define _P2P_H_

#ifndef _TYPEDEFS_H_
#include <typedefs.h>
#endif
#include <wlioctl.h>
#include <proto/802.11.h>

/* This marks the start of a packed structure section. */
#include <packed_section_start.h>


/* WiFi P2P OUI values */
#define P2P_OUI         WFA_OUI             /* WiFi P2P OUI */
#define P2P_VER         WFA_OUI_TYPE_P2P    /* P2P version: 9=WiFi P2P v1.0 */

#define P2P_IE_ID       0xdd            /* P2P IE element ID */

/* WiFi P2P IE */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_ie {
	uint8   id;     /* IE ID: 0xDD */
	uint8   len;        /* IE length */
	uint8   OUI[3];     /* WiFi P2P specific OUI: P2P_OUI */
	uint8   oui_type;   /* Identifies P2P version: P2P_VER */
	uint8   subelts[1]; /* variable length subelements */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_ie wifi_p2p_ie_t;

#define P2P_IE_FIXED_LEN    6

#define P2P_ATTR_ID_OFF         0
#define P2P_ATTR_LEN_OFF        1
#define P2P_ATTR_DATA_OFF       3

#define P2P_ATTR_HDR_LEN        3 /* ID + 2-byte length field spec 1.02 */

/* P2P IE Subelement IDs from WiFi P2P Technical Spec 1.00 */
#define P2P_SEID_STATUS         0   /* Status */
#define P2P_SEID_MINOR_RC       1   /* Minor Reason Code */
#define P2P_SEID_P2P_INFO       2   /* P2P Capability (capabilities info) */
#define P2P_SEID_DEV_ID         3   /* P2P Device ID */
#define P2P_SEID_INTENT         4   /* Group Owner Intent */
#define P2P_SEID_CFG_TIMEOUT        5   /* Configuration Timeout */
#define P2P_SEID_CHANNEL        6   /* Channel */
#define P2P_SEID_GRP_BSSID      7   /* P2P Group BSSID */
#define P2P_SEID_XT_TIMING      8   /* Extended Listen Timing */
#define P2P_SEID_INTINTADDR     9   /* Intended P2P Interface Address */
#define P2P_SEID_P2P_MGBTY      10  /* P2P Manageability */
#define P2P_SEID_CHAN_LIST      11  /* Channel List */
#define P2P_SEID_ABSENCE        12  /* Notice of Absence */
#define P2P_SEID_DEV_INFO       13  /* Device Info */
#define P2P_SEID_GROUP_INFO     14  /* Group Info */
#define P2P_SEID_GROUP_ID       15  /* Group ID */
#define P2P_SEID_P2P_IF         16  /* P2P Interface */
#define P2P_SEID_VNDR           221 /* Vendor-specific subelement */

#define P2P_SE_VS_ID_SERVICES   0x1b /* BRCM proprietary subel: L2 Services */


/* WiFi P2P IE subelement: P2P Capability (capabilities info) */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_info_se_s {
	uint8   eltId;      /* SE ID: P2P_SEID_P2P_INFO */
	uint8   len[2];     /* SE length not including eltId, len fields */
	uint8   dev;        /* Device Capability Bitmap */
	uint8   group;      /* Group Capability Bitmap */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_info_se_s wifi_p2p_info_se_t;

/* P2P Capability subelement's Device Capability Bitmap bit values */
#define P2P_CAPSE_DEV_SERVICE_DIS   0x1 /* Service Discovery */
#define P2P_CAPSE_DEV_CLIENT_DIS    0x2 /* Client Discoverability */
#define P2P_CAPSE_DEV_CONCURRENT    0x4 /* Concurrent Operation */
#define P2P_CAPSE_DEV_INFRA_MAN     0x8 /* P2P Infrastructure Managed */
#define P2P_CAPSE_DEV_LIMIT         0x10 /* P2P Device Limit */
#define P2P_CAPSE_INVITE_PROC       0x20 /* P2P Invitation Procedure */

/* P2P Capability subelement's Group Capability Bitmap bit values */
#define P2P_CAPSE_GRP_OWNER         0x1 /* P2P Group Owner */
#define P2P_CAPSE_PERSIST_GRP       0x2 /* Persistent P2P Group */
#define P2P_CAPSE_GRP_LIMIT         0x4 /* P2P Group Limit */
#define P2P_CAPSE_GRP_INTRA_BSS     0x8 /* Intra-BSS Distribution */
#define P2P_CAPSE_GRP_X_CONNECT     0x10 /* Cross Connection */
#define P2P_CAPSE_GRP_PERSISTENT    0x20 /* Persistent Reconnect */
#define P2P_CAPSE_GRP_FORMATION     0x40 /* Group Formation */


/* WiFi P2P IE subelement: Group Owner Intent */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_intent_se_s {
	uint8   eltId;      /* SE ID: P2P_SEID_INTENT */
	uint8   len[2];     /* SE length not including eltId, len fields */
	uint8   intent;     /* Intent Value 0...15 (0=legacy 15=master only) */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_intent_se_s wifi_p2p_intent_se_t;

/* WiFi P2P IE subelement: Configuration Timeout */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_cfg_tmo_se_s {
	uint8   eltId;      /* SE ID: P2P_SEID_CFG_TIMEOUT */
	uint8   len[2];     /* SE length not including eltId, len fields */
	uint8   go_tmo;     /* GO config timeout in units of 10 ms */
	uint8   client_tmo; /* Client config timeout in units of 10 ms */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_cfg_tmo_se_s wifi_p2p_cfg_tmo_se_t;


/* WiFi P2P IE subelement: Status */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_status_se_s {
	uint8   eltId;      /* SE ID: P2P_SEID_STATUS */
	uint8   len[2];     /* SE length not including eltId, len fields */
	uint8   status;     /* Status Code: P2P_STATSE_* */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_status_se_s wifi_p2p_status_se_t;

/* Status subelement Status Code definitions */
#define P2P_STATSE_SUCCESS              0
				/* Success */
#define P2P_STATSE_FAIL_INFO_CURR_UNAVAIL   1
				/* Failed, information currently unavailable */
#define P2P_STATSE_PASSED_UP            P2P_STATSE_FAIL_INFO_CURR_UNAVAIL
				/* Old name for above in P2P spec 1.08 and older */
#define P2P_STATSE_FAIL_INCOMPAT_PARAMS     2
				/* Failed, incompatible parameters */
#define P2P_STATSE_FAIL_LIMIT_REACHED       3
				/* Failed, limit reached */
#define P2P_STATSE_FAIL_INVALID_PARAMS      4
				/* Failed, invalid parameters */
#define P2P_STATSE_FAIL_UNABLE_TO_ACCOM     5
				/* Failed, unable to accomodate request */
#define P2P_STATSE_FAIL_PROTO_ERROR         6
				/* Failed, previous protocol error or disruptive behaviour */
#define P2P_STATSE_FAIL_NO_COMMON_CHAN      7
				/* Failed, no common channels */
#define P2P_STATSE_FAIL_UNKNOWN_GROUP       8
				/* Failed, unknown P2P Group */
#define P2P_STATSE_FAIL_INTENT          9
				/* Failed, both peers indicated Intent 15 in GO Negotiation */
#define P2P_STATSE_FAIL_INCOMPAT_PROVIS     10
				/* Failed, incompatible provisioning method */
#define P2P_STATSE_FAIL_USER_REJECT     11
				/* Failed, rejected by user */

/* WiFi P2P IE attribute: Extended Listen Timing */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_ext_se_s {
	uint8   eltId;      /* ID: P2P_SEID_EXT_TIMING */
	uint8   len[2];     /* length not including eltId, len fields */
	uint8   avail[2];   /* availibility period */
	uint8   interval[2];    /* availibility interval */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_ext_se_s wifi_p2p_ext_se_t;

#define P2P_EXT_MIN 10  /* minimum 10ms */

/* WiFi P2P IE subelement: Intended P2P Interface Address */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_intintad_se_s {
	uint8   eltId;      /* SE ID: P2P_SEID_INTINTADDR */
	uint8   len[2];     /* SE length not including eltId, len fields */
	uint8   mac[6];     /* intended P2P interface MAC address */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_intintad_se_s wifi_p2p_intintad_se_t;

/* WiFi P2P IE subelement: Channel */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_channel_se_s {
	uint8   eltId;      /* SE ID: P2P_SEID_STATUS */
	uint8   len[2];     /* SE length not including eltId, len fields */
	uint8   band;       /* Regulatory Class (band) */
	uint8   channel;    /* Channel */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_channel_se_s wifi_p2p_channel_se_t;


/* Channel Entry structure within the Channel List SE */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_chanlist_entry_s {
	uint8   band;                       /* Regulatory Class (band) */
	uint8   num_channels;               /* # of channels in the channel list */
	uint8   channels[WL_NUMCHANNELS];   /* Channel List */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_chanlist_entry_s wifi_p2p_chanlist_entry_t;
#define WIFI_P2P_CHANLIST_SE_MAX_ENTRIES 2

/* WiFi P2P IE subelement: Channel List */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_chanlist_se_s {
	uint8   eltId;      /* SE ID: P2P_SEID_STATUS */
	uint8   len[2];     /* SE length not including eltId, len fields */
	uint8   country[3]; /* Country String */
	uint8   num_entries;    /* # of channel entries */
	wifi_p2p_chanlist_entry_t   entries[WIFI_P2P_CHANLIST_SE_MAX_ENTRIES];
						/* Channel Entry List */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_chanlist_se_s wifi_p2p_chanlist_se_t;

/* WiFi P2P IE's Device Info subelement */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_devinfo_se_s {
	uint8   eltId;          /* SE ID: P2P_SEID_DEVINFO */
	uint8   len[2];         /* SE length not including eltId, len fields */
	uint8   mac[6];         /* P2P Device MAC address */
	uint16  wps_cfg_meths;      /* Config Methods: reg_prototlv.h WPS_CONFMET_* */
	uint8   pri_devtype[8];     /* Primary Device Type */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_devinfo_se_s wifi_p2p_devinfo_se_t;

#define P2P_DEV_TYPE_LEN    8

/* WiFi P2P IE's Group Info subelement Client Info Descriptor */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_cid_fixed_s {
	uint8   len;
	uint8   devaddr[ETHER_ADDR_LEN];    /* P2P Device Address */
	uint8   ifaddr[ETHER_ADDR_LEN];     /* P2P Interface Address */
	uint8   devcap;             /* Device Capability */
	uint8   cfg_meths[2];           /* Config Methods: reg_prototlv.h WPS_CONFMET_* */
	uint8   pridt[P2P_DEV_TYPE_LEN];    /* Primary Device Type */
	uint8   secdts;             /* Number of Secondary Device Types */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_cid_fixed_s wifi_p2p_cid_fixed_t;

/* WiFi P2P IE's Device ID subelement */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_devid_se_s {
	uint8   eltId;
	uint8   len[2];
	struct ether_addr   addr;           /* P2P Device MAC address */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_devid_se_s wifi_p2p_devid_se_t;

/* WiFi P2P IE subelement: P2P Manageability */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_mgbt_se_s {
	uint8   eltId;      /* SE ID: P2P_SEID_P2P_MGBTY */
	uint8   len[2];     /* SE length not including eltId, len fields */
	uint8   mg_bitmap;  /* manageability bitmap */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_mgbt_se_s wifi_p2p_mgbt_se_t;
/* mg_bitmap field bit values */
#define P2P_MGBTSE_P2PDEVMGMT_FLAG   0x1 /* AP supports Managed P2P Device */

/* WiFi P2P IE subelement: Group Info */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_grpinfo_se_s {
	uint8   eltId;          /* SE ID: P2P_SEID_GROUP_INFO */
	uint8   len[2];         /* SE length not including eltId, len fields */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_grpinfo_se_s wifi_p2p_grpinfo_se_t;


/* WiFi P2P Action Frame */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_action_frame {
	uint8   category;   /* P2P_AF_CATEGORY */
	uint8   OUI[3];     /* OUI - P2P_OUI */
	uint8   type;       /* OUI Type - P2P_VER */
	uint8   subtype;    /* OUI Subtype - P2P_AF_* */
	uint8   dialog_token;   /* nonzero, identifies req/resp tranaction */
	uint8   elts[1];    /* Variable length information elements.  Max size =
				 * ACTION_FRAME_SIZE - sizeof(this structure) - 1
				 */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_action_frame wifi_p2p_action_frame_t;
#define P2P_AF_CATEGORY     0x7f

#define P2P_AF_FIXED_LEN    7

/* WiFi P2P Action Frame OUI Subtypes */
#define P2P_AF_NOTICE_OF_ABSENCE    0   /* Notice of Absence */
#define P2P_AF_PRESENCE_REQ     1   /* P2P Presence Request */
#define P2P_AF_PRESENCE_RSP     2   /* P2P Presence Response */
#define P2P_AF_GO_DISC_REQ      3   /* GO Discoverability Request */


/* WiFi P2P Public Action Frame */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_pub_act_frame {
	uint8   category;   /* P2P_PUB_AF_CATEGORY */
	uint8   action;     /* P2P_PUB_AF_ACTION */
	uint8   oui[3];     /* P2P_OUI */
	uint8   oui_type;   /* OUI type - P2P_VER */
	uint8   subtype;    /* OUI subtype - P2P_TYPE_* */
	uint8   dialog_token;   /* nonzero, identifies req/rsp transaction */
	uint8   elts[1];    /* Variable length information elements.  Max size =
				 * ACTION_FRAME_SIZE - sizeof(this structure) - 1
				 */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_pub_act_frame wifi_p2p_pub_act_frame_t;
#define P2P_PUB_AF_FIXED_LEN    8
#define P2P_PUB_AF_CATEGORY 0x04
#define P2P_PUB_AF_ACTION   0x09

/* WiFi P2P Public Action Frame OUI Subtypes */
#define P2P_PAF_GON_REQ     0   /* Group Owner Negotiation Req */
#define P2P_PAF_GON_RSP     1   /* Group Owner Negotiation Rsp */
#define P2P_PAF_GON_CONF    2   /* Group Owner Negotiation Confirm */
#define P2P_PAF_INVITE_REQ  3   /* P2P Invitation Request */
#define P2P_PAF_INVITE_RSP  4   /* P2P Invitation Response */
#define P2P_PAF_DEVDIS_REQ  5   /* Device Discoverability Request */
#define P2P_PAF_DEVDIS_RSP  6   /* Device Discoverability Response */
#define P2P_PAF_PROVDIS_REQ 7   /* Provision Discovery Request */
#define P2P_PAF_PROVDIS_RSP 8   /* Provision Discovery Request */

/* TODO: Stop using these obsolete aliases for P2P_PAF_GON_* */
#define P2P_TYPE_MNREQ      P2P_PAF_GON_REQ
#define P2P_TYPE_MNRSP      P2P_PAF_GON_RSP
#define P2P_TYPE_MNCONF     P2P_PAF_GON_CONF

/* WiFi P2P IE subelement: Notice of Absence */
BWL_PRE_PACKED_STRUCT struct wifi_p2p_noa_desc {
	uint8   cnt_type;   /* Count/Type */
	uint32  duration;   /* Duration */
	uint32  interval;   /* Interval */
	uint32  start;      /* Start Time */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_noa_desc wifi_p2p_noa_desc_t;

BWL_PRE_PACKED_STRUCT struct wifi_p2p_noa_se {
	uint8   eltId;      /* Subelement ID */
	uint8   len[2];     /* Length */
	uint8   index;      /* Index */
	uint8   ops_ctw_parms;  /* CTWindow and OppPS Parameters */
	wifi_p2p_noa_desc_t desc[1];    /* Notice of Absence Descriptor(s) */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2p_noa_se wifi_p2p_noa_se_t;

#define P2P_NOA_SE_FIXED_LEN    5

/* cnt_type field values */
#define P2P_NOA_DESC_CNT_RESERVED   0   /* reserved and should not be used */
#define P2P_NOA_DESC_CNT_REPEAT     255 /* continuous schedule */
#define P2P_NOA_DESC_TYPE_PREFERRED 1   /* preferred values */
#define P2P_NOA_DESC_TYPE_ACCEPTABLE    2   /* acceptable limits */

/* ctw_ops_parms field values */
#define P2P_NOA_CTW_MASK    0x7f
#define P2P_NOA_OPS_MASK    0x80
#define P2P_NOA_OPS_SHIFT   7

#define P2P_CTW_MIN 10  /* minimum 10TU */

/*
 * P2P Service Discovery related
 */
#define P2PSD_ACTION_CATEGORY       0x04
				/* Public action frame */
#define P2PSD_ACTION_ID_GAS_IREQ    0x0a
				/* Action value for GAS Initial Request AF */
#define P2PSD_ACTION_ID_GAS_IRESP   0x0b
				/* Action value for GAS Initial Response AF */
#define P2PSD_ACTION_ID_GAS_CREQ    0x0c
				/* Action value for GAS Comback Request AF */
#define P2PSD_ACTION_ID_GAS_CRESP   0x0d
				/* Action value for GAS Comback Response AF */
#define P2PSD_AD_EID                0x6c
				/* Advertisement Protocol IE ID */
#define P2PSD_ADP_TUPLE_QLMT_PAMEBI 0x00
				/* Query Response Length Limit 7 bits plus PAME-BI 1 bit */
#define P2PSD_ADP_PROTO_ID          0x00
				/* Advertisement Protocol ID. Always 0 for P2P SD */
#define P2PSD_GAS_OUI               P2P_OUI
				/* WFA OUI */
#define P2PSD_GAS_OUI_SUBTYPE       P2P_VER
				/* OUI Subtype for GAS IE */
#define P2PSD_GAS_NQP_INFOID        0xDDDD
				/* NQP Query Info ID: 56797 */
#define P2PSD_GAS_COMEBACKDEALY     0x00
				/* Not used in the Native GAS protocol */

/* Service Protocol Type */
typedef enum p2psd_svc_protype {
	SVC_RPOTYPE_ALL = 0,
	SVC_RPOTYPE_BONJOUR = 1,
	SVC_RPOTYPE_UPNP = 2,
	SVC_RPOTYPE_WSD = 3,
	SVC_RPOTYPE_VENDOR = 255
} p2psd_svc_protype_t;

/* Service Discovery response status code */
typedef enum {
	P2PSD_RESP_STATUS_SUCCESS = 0,
	P2PSD_RESP_STATUS_PROTYPE_NA = 1,
	P2PSD_RESP_STATUS_DATA_NA = 2,
	P2PSD_RESP_STATUS_BAD_REQUEST = 3
} p2psd_resp_status_t;

/* Advertisement Protocol IE tuple field */
BWL_PRE_PACKED_STRUCT struct wifi_p2psd_adp_tpl {
	uint8   llm_pamebi; /* Query Response Length Limit bit 0-6, set to 0 plus
				* Pre-Associated Message Exchange BSSID Independent bit 7, set to 0
				*/
	uint8   adp_id;     /* Advertisement Protocol ID: 0 for NQP Native Query Protocol */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2psd_adp_tpl wifi_p2psd_adp_tpl_t;

/* Advertisement Protocol IE */
BWL_PRE_PACKED_STRUCT struct wifi_p2psd_adp_ie {
	uint8   id;     /* IE ID: 0x6c - 108 */
	uint8   len;    /* IE length */
	wifi_p2psd_adp_tpl_t adp_tpl;  /* Advertisement Protocol Tuple field. Only one
				* tuple is defined for P2P Service Discovery
				*/
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2psd_adp_ie wifi_p2psd_adp_ie_t;

/* NQP Vendor-specific Content */
BWL_PRE_PACKED_STRUCT struct wifi_p2psd_nqp_query_vsc {
	uint8   oui_subtype;    /* OUI Subtype: 0x09 */
	uint16  svc_updi;       /* Service Update Indicator */
	uint8   svc_tlvs[1];    /* wifi_p2psd_qreq_tlv_t type for service request,
				* wifi_p2psd_qresp_tlv_t type for service response
				*/
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2psd_nqp_query_vsc wifi_p2psd_nqp_query_vsc_t;

/* Service Request TLV */
BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qreq_tlv {
	uint16  len;            /* Length: 5 plus size of Query Data */
	uint8   svc_prot;       /* Service Protocol Type */
	uint8   svc_tscid;      /* Service Transaction ID */
	uint8   query_data[1];  /* Query Data, passed in from above Layer 2 */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2psd_qreq_tlv wifi_p2psd_qreq_tlv_t;

/* Query Request Frame, defined in generic format, instead of NQP specific */
BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qreq_frame {
	uint16  info_id;    /* Info ID: 0xDDDD */
	uint16  len;        /* Length of service request TLV, 5 plus the size of request data */
	uint8   oui[3];     /* WFA OUI: 0x0050F2 */
	uint8   qreq_vsc[1]; /* Vendor-specific Content: wifi_p2psd_nqp_query_vsc_t type for NQP */

} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2psd_qreq_frame wifi_p2psd_qreq_frame_t;

/* GAS Initial Request AF body, "elts" in wifi_p2p_pub_act_frame */
BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_ireq_frame {
	wifi_p2psd_adp_ie_t     adp_ie;     /* Advertisement Protocol IE */
	uint16                  qreq_len;   /* Query Request Length */
	uint8   qreq_frm[1];    /* Query Request Frame wifi_p2psd_qreq_frame_t */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2psd_gas_ireq_frame wifi_p2psd_gas_ireq_frame_t;

/* Service Response TLV */
BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qresp_tlv {
	uint16  len;                /* Length: 5 plus size of Query Data */
	uint8   svc_prot;           /* Service Protocol Type */
	uint8   svc_tscid;          /* Service Transaction ID */
	uint8   status;             /* Value defined in Table 57 of P2P spec. */
	uint8   query_data[1];      /* Response Data, passed in from above Layer 2 */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2psd_qresp_tlv wifi_p2psd_qresp_tlv_t;

/* Query Response Frame, defined in generic format, instead of NQP specific */
BWL_PRE_PACKED_STRUCT struct wifi_p2psd_qresp_frame {
	uint16  info_id;    /* Info ID: 0xDDDD */
	uint16  len;        /* Lenth of service response TLV, 6 plus the size of resp data */
	uint8   oui[3];     /* WFA OUI: 0x0050F2 */
	uint8   qresp_vsc[1]; /* Vendor-specific Content: wifi_p2psd_qresp_tlv_t type for NQP */

} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2psd_qresp_frame wifi_p2psd_qresp_frame_t;

/* GAS Initial Response AF body, "elts" in wifi_p2p_pub_act_frame */
BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_iresp_frame {
	uint16      status;     /* Value defined in Table 7-23 of IEEE P802.11u */
	uint16  cb_delay;       /* GAS Comeback Delay */
	wifi_p2psd_adp_ie_t adp_ie;     /* Advertisement Protocol IE */
	uint16      qresp_len;  /* Query Response Length */
	uint8   qresp_frm[1];   /* Query Response Frame wifi_p2psd_qresp_frame_t */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2psd_gas_iresp_frame wifi_p2psd_gas_iresp_frame_t;

/* GAS Comeback Response AF body, "elts" in wifi_p2p_pub_act_frame */
BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_cresp_frame {
	uint16  status;         /* Value defined in Table 7-23 of IEEE P802.11u */
	uint8   fragment_id;    /* Fragmentation ID */
	uint16  cb_delay;       /* GAS Comeback Delay */
	wifi_p2psd_adp_ie_t adp_ie;     /* Advertisement Protocol IE */
	uint16  qresp_len;      /* Query Response Length */
	uint8   qresp_frm[1];   /* Query Response Frame wifi_p2psd_qresp_frame_t */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2psd_gas_cresp_frame wifi_p2psd_gas_cresp_frame_t;

/* Wi-Fi GAS Public Action Frame */
BWL_PRE_PACKED_STRUCT struct wifi_p2psd_gas_pub_act_frame {
	uint8   category;       /* 0x04 Public Action Frame */
	uint8   action;         /* 0x6c Advertisement Protocol */
	uint8   dialog_token;   /* nonzero, identifies req/rsp transaction */
	uint8   query_data[1];  /* Query Data. wifi_p2psd_gas_ireq_frame_t
					 * or wifi_p2psd_gas_iresp_frame_t format
					 */
} BWL_POST_PACKED_STRUCT;
typedef struct wifi_p2psd_gas_pub_act_frame wifi_p2psd_gas_pub_act_frame_t;

/* This marks the end of a packed structure section. */
#include <packed_section_end.h>

#endif /* _P2P_H_ */
